package com.atguigu.lease.common.utils;

import com.atguigu.lease.common.exception.LeaseException;
import com.atguigu.lease.common.login.LoginUserHolder;
import com.atguigu.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

/*
*功能：
 作者：chenhao
*日期： 2024/11/25 下午7:41
*/
public class JwtUtil {

    private static long tokenExpiration = 60 * 60 * 1000;
    private static SecretKey tokenSignKey = Keys.hmacShaKeyFor("M0PKKI6pYGVWWfDZw90a0lTpGYX1d4AQ".getBytes());

    public static String createToken(Long userId, String username) {
        String token = Jwts.builder(). //这里的token就是一个jws，jws就是带签名的jwt
                setSubject("USER_INFO").  //设置主题
                setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)).
                claim("userId", userId). //自定义字段
                claim("username", username).  //自定义字段
                signWith(tokenSignKey).  //加入密钥，最后根据header，payload，和密钥，这三部分计算得到签名。
                compact();//组装上述部分
        return token;
    }
    public static Claims parseToken(String token){
        if (token==null){
            throw new LeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);
        }

        try {

            JwtParser jwtParser = Jwts.parserBuilder() //设置一个解析器，代表开始解析jws
                        .setSigningKey(tokenSignKey) //往解析器传入密钥
                        .build(); //构造完毕

            Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);//用解析器解析token,得到jws对象
            Claims body = claimsJws.getBody();//jws对象调用这个方法，得到payload部分，也就是我们自定义字段存放的位置
            return body;//返回该部分
        }catch (ExpiredJwtException e){
            throw new LeaseException(ResultCodeEnum.TOKEN_EXPIRED);
        }catch (JwtException e){
            throw new LeaseException(ResultCodeEnum.TOKEN_INVALID);
        }
    }

}